L2-011 玩转二叉树

题目 L2-011 玩转二叉树

image-c9baf621

思路分析

代码实现

#include<bits/stdc++.h>

using namespace std;

#define endl '\n'

using ll = long long;

using ull = unsigned long long;

using PII = pair<int,int>;

using Pll = pair<ll,ll>;

int dx[4]= {-1,0,1,0},dy[4]= {0,1,0,-1};

const int inf = 0x3f3f3f3f;

const int N=35;

int in[N],pre[N];

typedef struct BiTNode {

	int val;

	struct BiTNode *lchild,*rchild;

} BiTNode,*BiTree;

BiTree build_Tree_from_PreIn(int in[],int l1,int r1,int pre[],int l2,int r2) {

	if(l1>r1 || l2>r2)	return NULL;

	BiTree root = new BiTNode;

	root->val = pre[l2];

	int tmp;

	for(int i=l1;i<=r1;i++){

		if(in[i]==pre[l2]){

			tmp=i;

			break;

		}

	}

	root->lchild=build_Tree_from_PreIn(in,l1,tmp-1,pre,l2+1,l2+1+tmp-l1-1);

	root->rchild=build_Tree_from_PreIn(in,tmp+1,r1,pre,l2+1+tmp-l1-1+1,r2);

	return root;

}

void print_pre(BiTree root){

	if(root){

		cout<<root->val<<" ";

		print_pre(root->lchild);

		print_pre(root->rchild);

	}

}

void mirror(BiTree root){

	if(!root)	return;

	swap(root->lchild,root->rchild);

	mirror(root->lchild);

	mirror(root->rchild);

}

void bfs(BiTree root){

	if(!root)	return;

	queue<BiTree> q;

	q.push(root);

	bool is_first=true;

	while(q.size()){

		auto tmp=q.front();q.pop();

		if(is_first){

			cout<<tmp->val;

			is_first=false;

		}else{

			cout<<" "<<tmp->val;

		}

		if(tmp->lchild) 	q.push(tmp->lchild);

		if(tmp->rchild) 	q.push(tmp->rchild);

	}

}

int main() {

	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);

	int n;cin>>n;

	for(int i=0;i<n;i++)	cin>>in[i];

	for(int i=0;i<n;i++)	cin>>pre[i];

	BiTree root = build_Tree_from_PreIn(in,0,n-1,pre,0,n-1);

	//	print_pre(root);

	mirror(root);

	bfs(root);

	return 0;

}

同类题型

视频讲解


⬅️ L2-010 排座位 🏠 00-天梯赛 ➡️ L2-012 关于堆的判断